package br.com.despesasPlan.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import br.com.despesasPlan.interfaces.InterfaceDao;
import br.com.despesasPlan.modelo.Receita;
import br.com.despesasPlan.sql.GenericSql;

public class ReceitaDao extends GenericDao implements InterfaceDao<Receita> {
	String[] campos = new String[3];
	private final static String TABELA = "receitas";

	public ReceitaDao() {
		this.campos[0] = "id";
		this.campos[1] = "id_pessoas";
		this.campos[2] = "valor";
	}
	
	private String getSqlInsert() {
		return GenericSql.getSqlInsert(TABELA, this.campos);
	}
	
	private String getSqlUpdate() {
		return GenericSql.getSqlUpdate(TABELA, this.campos);
	}
	
	private String getSqlDelete() {
		return GenericSql.getSqlDelete(TABELA, this.campos);
	}
	
	private String getSqlSelectList(ArrayList<Object> o) {
		StringBuilder sbSqlPessoaList = new StringBuilder(GenericSql.getSqlObjectList(TABELA, campos, o));
		return sbSqlPessoaList.toString();
	}
	
	private String getSqlSelect() {
		StringBuilder sbSqlPessoaList = new StringBuilder(GenericSql.getSqlObject(TABELA));
		return sbSqlPessoaList.toString();
	}
	
	private ArrayList<Object> getParamInsertSelect(Receita receita) {
		ArrayList<Object> paramList = new ArrayList<>();
		UtilDao utilDao = new UtilDao();
		long proximoId = utilDao.getProximoCodigo(TABELA);
		paramList.add(proximoId);
		if (receita.getIdPessoa() != null)
			paramList.add(receita.getIdPessoa());
		if (receita.getValor() != null)
			paramList.add(receita.getValor());
		return paramList;
	}
	
	private ArrayList<Object> getParamUpdate(Receita receita) {
		ArrayList<Object> paramList = new ArrayList<>();
		if (receita.getIdPessoa() != null)
			paramList.add(receita.getIdPessoa());
		if (receita.getValor() != null)
			paramList.add(receita.getValor());
		paramList.add(receita.getId());
		return paramList;
	}
	
	@Override
	public boolean adicionar(Receita r) {
		boolean isRegistroAdicionado = false;
		UtilDao utilDao = new UtilDao();
		String sqlAdicionar = getSqlInsert();
		ArrayList<Object> params = getParamInsertSelect(r);
		utilDao.executeSql(sqlAdicionar, params);
		isRegistroAdicionado = true;
		return isRegistroAdicionado;
	}

	@Override
	public boolean editar(Receita r) {
		boolean isRegistroAlterado = false;
		UtilDao utilDao = new UtilDao();
		String sqlAlterar = getSqlUpdate();
		ArrayList<Object> params = getParamUpdate(r);
		utilDao.executeSql(sqlAlterar, params);
		isRegistroAlterado = true;
		return isRegistroAlterado;
	}

	@Override
	public boolean remover(int i) {
		boolean isRegistroRemovido = false;
		UtilDao utilDao = new UtilDao();
		String sqlRemove = getSqlDelete();
		ArrayList<Object> params = new ArrayList<Object>();
		params.add(i);
		utilDao.executeSql(sqlRemove, params);
		isRegistroRemovido = true;
		return isRegistroRemovido;
	}

	@Override
	public ArrayList<Receita> getListByObjectValues(Receita r) {
		ArrayList<Receita> receitaList = new ArrayList<Receita>();
		UtilDao utilDao = new UtilDao();
		ArrayList<Object> objects = new ArrayList<Object>();
		objects.add(r.getId());
		objects.add(r.getIdPessoa());
		objects.add(r.getValor());
		String sqlSelectList = getSqlSelectList(objects);
		try {
		ResultSet rs = utilDao.executeQuerySql(sqlSelectList, getParamInsertSelect(r));
		while (rs.next()) {
			Receita receita = new Receita();
			receita.setId(rs.getLong("id"));
			receita.setIdPessoa(rs.getLong("id_pessoas"));
			receita.setValor(rs.getDouble("valor"));
			receitaList.add(receita);
		}
		} catch (SQLException e) {
			throw new RuntimeException("Erro ao buscar pessoa: "+e.getMessage());
		}
		return receitaList;
	}

	@Override
	public Receita getValuesById(int i) {
		UtilDao utilDao = new UtilDao();
		String sqlSelect = getSqlSelect();
		Receita receita = new Receita();
		ArrayList<Object> params = new ArrayList<Object>();
		params.add(i);
		try {
		ResultSet rs = utilDao.executeQuerySql(sqlSelect, params);
		receita.setId(rs.getLong("id"));
		receita.setIdPessoa(rs.getLong("id_pessoas"));
		receita.setValor(rs.getDouble("valor"));
		} catch (SQLException e) {
			throw new RuntimeException("Erro ao buscar pessoa: "+e.getMessage());
		}
		return receita;
	}
}
